// 抽象类:包含抽象方法(抽象方法一般没有任何的具体内容的实现),也可以包含实例方法,抽象类是不能被实例化,为了让子类进行实例化及实现内部抽象方法
// 抽象类的目的或者是作用都是为了子类服务的
(() => {
  // 定义一个抽象类
  abstract class Animal {
    // 3.抽象属性
    // abstract name: string;
    // 1.抽象方法
    abstract eat();

    // 报错的, 抽象方法不能有具体的实现
    // abstract eat() {
    //   console.log("真好吃");
    // }
    // 2.实例方法
    run() {
      console.log("飞着跑");
    }
  }
  //   定义一个子类(派生类)
  class Dog extends Animal {
    name: string = "小黄";
    //   重新的实现抽象类中方法,此时这个方法就是当前Dog类的实例方法
    eat() {
      console.log("舔着吃");
    }
  }

  const dog: Dog = new Dog();
  dog.eat();
  //   调用的是抽象类中的实例方法
  dog.run();
  //   console.log(dog.name);

  //   不能实例化抽象类的对象
  //   const ani: Animal = new Animal();
})();
